// Copyright [2020] <Weaverzhu>
#include <bits/stdc++.h>
using namespace std;
// #define ONLINE_JUDGE
#ifndef ONLINE_JUDGE
#define dbg(x...) { cerr << "\033[32;1m" << #x << " -> "; err(x); }
void err() { cerr << "\033[39;0m" << endl; }
template<typename T, typename... A>
void err(T a, A... x) { cerr << a << ' '; err(x...); }
#else
#define dbg(...)
#endif

int n;

const int N = 1e3+50;

vector<pair<int, int>> G[N];
int u[N], v[N], f[N];

struct dsu {
    int f[N];
    void init(int n) {
        for (int i=1; i<=n; ++i)
            f[i] = i;
    }

    int find(int x) {
        return x == f[x]? x : (f[x] = find(f[x]));
    }
    void connect(int x, int y) {
        ::f[y] = x;
        f[find(y)] = find(x);
    }
    inline bool pd(int x, int y) {
        return find(x) == find(y);
    }
} ds;

void build() {
    for (int i=1; i<=n; ++i)
        G[i].clear();
    for (int i=0; i<n-1; ++i) {
        int x = u[i], y = v[i];
        if (!ds.pd(x, y)) {
            int fa = ds.find(x);
            dbg(x, fa);
            G[fa].push_back(make_pair(x, y));
            fa = ds.find(y);
            dbg(y, fa); 
            G[fa].push_back(make_pair(y, x));
        }
    }
}

int submit(int a, int b) {
    printf("? %d %d\n", a, b);
    fflush(stdout);
    int x; scanf("%d", &x);
    return x;
}

int main(int argc, char const *argv[]) {
    // code
    scanf("%d", &n);
    for (int i=0; i<n-1; ++i) {
        scanf("%d%d", u+i, v+i);
    }
    ds.init(n);
    int times = n / 2;
    for (int i=0; i<times; ++i) {
        build();
        if (i == times-1 && n % 2 == 0) {
            pair<int, int> e;
            for (int i=1; i<=n; ++i)
                if (G[i].size()) {
                    e = G[i][0];
                    break;
                }
            int w = submit(e.first, e.second);
            if (w == e.second) swap(e.first, e.second);
            ds.connect(e.first, e.second);
        } else {
            for (int i=1; i<=n; ++i) {
                if (G[i].size() > 1) {
                    auto e1 = G[i][0], e2 = G[i][1];
                    dbg(e1.first, e1.second, e2.first, e2.second);
                    int w = submit(e1.second, e2.second);
                    if (w == e1.second) {
                        swap(e1.first, e1.second);
                    } else if (w == e2.second) {
                        swap(e2.first, e2.second);
                    }
                    ds.connect(e1.first, e1.second);
                    ds.connect(e2.first, e2.second);
                    break;
                }
            }
        }
    }

    for (int i=1; i<=n; ++i)
        if (!f[i]) {
            printf("! %d\n", i);
            fflush(stdout);
            break;
        }
    return 0;
}
